package robotlion.controller;

import robotlion.view.RobotLionMainView;
import java.io.IOException;
import java.util.*;
import robotlion.model.*;
import Tools.ImageConverter;
import Tools.StatsManager;
import java.awt.Image;
import java.awt.Point;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import robotlion.view.Observateur;

/**
 *
 * @author Adrien Dos Reis
 */
public class Simulateur extends Thread{

    private Manager _manager;
    private Environnement _environnement;
    private TimerSimulateur taskSimulation;
    private Timer timerSimulation;
    private long periodSimulation; 
    private StatsManager stats;
    
    public Simulateur() {
        stats = new StatsManager("SimulationSave.txt");
        _manager = new Manager();
        periodSimulation = 1000;
        _environnement = new Environnement(0, EDirectionVent.SUD);
    }
    
    public void lancerSimulation(RobotLionMainView laFenetre)
    {   
        stats.startStats();
        taskSimulation = new TimerSimulateur(this);
        timerSimulation = new Timer();
        timerSimulation.schedule(taskSimulation, new Date(), periodSimulation);
    }
    
    // Méthode pas encore appelée
    // Il faudra l'appeler dans la classe TimerSimulateur, lorsqu'on gèrera plusieurs robots.
    public void go() {
        
        // gestion des incendies
        propagationIncendie();
        // gestion deplacement robots
        for(Robot rob : _manager.getListeRobot())
        {
                rob.seDeplacer(_manager.getCarte());
        }
        // gestion du manager et des missions
        _manager.donnerObjectif();

    }
    
    public void arreter() {
        timerSimulation.cancel();
        JOptionPane.showMessageDialog(null,"Simulation terminée!");
        stats.stopStats();
        stats.saveStats();
    }
    
    public void accelerer() {
        
    }
    
    public void addRobot(String p_nom, int p_vitesse, Point p_position, int p_nivAccessibilite, int p_algorithme,Observateur obs) {
        int accessibility = _manager.getCarte().getAccessibilite(p_position.x, p_position.y);
        if(accessibility < p_nivAccessibilite)
        {
            Robot lion = new Robot(p_nom, p_vitesse, p_position, p_nivAccessibilite, p_algorithme);
            _manager.addRobot(lion);
            lion.addObservateur(stats);
            if(obs!=null)
                lion.addObservateur(obs);
        }
    }
    
    public void delRobot(String p_nom) {
        _manager.delRobot(p_nom);
    }
    
    public ArrayList<Point> getRobot() {
        ArrayList<Point> coordonnees = new ArrayList();
        for(Robot rob : _manager.getListeRobot())
        {
           coordonnees.add(rob.getPosition());
        }
        return coordonnees;
    }
    
    public void addIncendie(Point cord, int intensite) {
        _manager.getCarte().addIncendie(cord.x, cord.y, intensite);
        stats.addIncendie();
    }
    
    public void delIncendie(Point cord,int intensite) {
        _manager.getCarte().decrIncendie(cord.x, cord.y, intensite);
        stats.delIncendie();
    }
    
    public ArrayList<Point> getIncendies() {
        return _manager.getCarte().getIncendies();
    }
    
    public void propagationIncendie() {
       ArrayList<Point> newIncendie = _environnement.progression(getIncendies());
       for(Point incendie : newIncendie)
       {
           addIncendie(incendie, 10);
       }
    }
    public Environnement getEnvironnement() {
        return _environnement;
    }

    public void setEnvironnement(int vitesse, EDirectionVent directionVent) {
        this._environnement.setDirectionVent(directionVent);
        this._environnement.setVitesse(vitesse);
    }

    public Manager getManager() {
        return _manager;
    }

    public void setManager(Manager _manager) {
        this._manager = _manager;
    }
    
    public Image initCarte(File imageFile, Observateur theObservateur) throws IOException
    {
        ImageConverter converter = new ImageConverter(imageFile);
        String imageConverted = imageFile.getPath() + imageFile.getName() + "converted";
        converter.creerImageCarte(imageConverted);
        ImageIcon bg = new ImageIcon(imageConverted);
        Carte carte = new Carte(converter.getMatriceCarte());
        carte.addObservateur(theObservateur);
        _manager.setCarte(carte);
        return bg.getImage();
    }
    
    public Image initCarte(File imageFile) throws IOException
    {
        ImageConverter converter = new ImageConverter(imageFile);
        String imageConverted = imageFile.getPath() + imageFile.getName() + "converted";
        converter.creerImageCarte(imageConverted);
        ImageIcon bg = new ImageIcon(imageConverted);
        Carte carte = new Carte(converter.getMatriceCarte());
        _manager.setCarte(carte);
        return bg.getImage();
    }
}
